﻿using System;
using System.Collections;
using System.Linq;
using System.Text;
using CRUD.InterfaceDAO;
using CapaNegocios;
using GestionadorBaseDatos;
using CapaGestion.Spring;
using System.Collections.Generic;

namespace CapaGestion
{
    /// <summary>
    /// Gestiona las reglas de negocio para los pagos.
    /// </summary>
    public class GestionarPago : IGestionPago
    {
        IDaoPago daoPago;
        IDaoUsuario daoUsuario;
        IDaoFormaPago daoFormaPago;
        IDaoMantenimientoPago daoMantenimientoPago;


        /// <summary>
        /// Metodo que permite obtener todos los pagos.
        /// </summary>
        /// <returns>
        /// Retorna una coleccion List que tiene objetos de tipo Pago.
        /// </returns>
        public List<Pago> ObtenerPagos()
        {
            IList listaPagos = daoPago.GetAll();
            List<Pago> lista = new List<Pago>();
            foreach (Pago pago in listaPagos)
            {
                pago.UsuarioAsociado = daoUsuario.GetByNickname(pago.UsuarioAsociado.Nickname);
                pago.FormaPagoAsociado = daoFormaPago.GetById(pago.FormaPagoAsociado);
                pago.MantenimientosPago = daoMantenimientoPago.GetMantenimientosPagoByPago(pago);

                lista.Add(pago);
            }


            return lista;

        }


        /// <summary>
        /// Metodo que permite obtener todos los pagos dependiendo de la forma de pago en que se registraron.
        /// </summary>
        /// <param name="formaPago">
        /// Este parametro es un objeto de tipo FormaPago
        /// </param>
        /// <returns>
        /// Retorna una coleccion de tipo IList que contiene objetos de tipo FormaPago.
        /// </returns>
        public IList ObtenerPagoPorFormaPago(FormaPago formaPago)
        {
            return daoPago.GetPagosByFormaPago(formaPago);
        }

        /// <summary>
        /// Metodo que permite insertar un nuevo pago
        /// </summary>
        /// <param name="pago">
        /// Este parametro es de tipo Pago
        /// </param>
        public void InsertarPago(Pago pago)
        {
            daoPago.Insert(pago);
        }

        /// <summary>
        /// Metodo que permite obtener los pagos registrados por un usuario en especifico.
        /// </summary>
        /// <param name="usuario">
        /// Este parametro es de tipo Usuario
        /// </param>
        /// <returns>
        /// Retorna una coleccion de List que contiene todos los pagos hechos por el usuario que especificamos.
        /// </returns>
        public List<Pago> ObtenerPagosPorUsuario(Usuario usuario)
        {
            IList listaPagosUsuario = daoPago.GetPagosByUsuario(usuario);

            List<Pago> listaPagosLlena = new List<Pago>();



            foreach (Pago pago in listaPagosUsuario)
            {


                pago.UsuarioAsociado = daoUsuario.GetByNickname(pago.UsuarioAsociado.Nickname);

                pago.FormaPagoAsociado = daoFormaPago.GetById(pago.FormaPagoAsociado);

                pago.MantenimientosPago = daoMantenimientoPago.GetMantenimientosPagoByPago(pago);

                listaPagosLlena.Add(pago);
            }



            return listaPagosLlena;

        }

        /// <summary>
        /// Metodo que permite actualizar los datos de un pago registrado.
        /// </summary>
        /// <param name="pago">
        /// Este parametro es de tipo Pago y representa el pago que se va a actualizar.
        /// </param>
        public void ActualizarPago(Pago pago)
        {
            daoPago.Update(pago);
        }


    }
}
